/*
 * FCML - Free Code Manipulation Library.
 * Copyright (C) 2010-2019 Slawomir Wojtasiak
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

/** @file fcml_instructions.h
 * Instruction codes and addressing modes/instruction forms.
 * @copyright Copyright (C) 2010-2017 Slawomir Wojtasiak. All rights reserved.
 * This project is released under the GNU Lesser General Public License.
 */

#ifndef FCML_INSTRUCTIONS_H_
#define FCML_INSTRUCTIONS_H_

/**
 * @defgroup INSTRUCTION_TYPES_GROUP Instructions types.
 * Instructions types.
 * @{
 */

#define    FCML_AMT_UNDEF      0x0000000000000000UL
/* Grouping. */
#define    FCML_AMT_SSEx       0x0000000000000001UL
#define    FCML_AMT_VEXx       0x0000000000000002UL
#define    FCML_AMT_SIMD       0x0000000000000004UL
/* CPUID. */
#define    FCML_AMT_GPI        0x0000000000000008UL
#define    FCML_AMT_FPU        0x0000000000000010UL
#define    FCML_AMT_MMX        0x0000000000000020UL | FCML_AMT_SSEx
#define    FCML_AMT_SSE        0x0000000000000040UL | FCML_AMT_SSEx
#define    FCML_AMT_SSE2       0x0000000000000080UL | FCML_AMT_SSEx
#define    FCML_AMT_SSE3       0x0000000000000100UL | FCML_AMT_SSEx
#define    FCML_AMT_SSSE3      0x0000000000000200UL | FCML_AMT_SSEx
#define    FCML_AMT_SSE41      0x0000000000000400UL | FCML_AMT_SSEx
#define    FCML_AMT_SSE42      0x0000000000000800UL | FCML_AMT_SSEx
#define    FCML_AMT_SSE4A      0x0000000000001000UL | FCML_AMT_SSEx
#define    FCML_AMT_AVX        0x0000000000002000UL | FCML_AMT_VEXx
#define    FCML_AMT_AVX2       0x0000000000004000UL | FCML_AMT_VEXx
#define    FCML_AMT_AES        0x0000000000008000UL
#define    FCML_AMT_SYSTEM     0x0000000000010000UL
#define    FCML_AMT_3DNOW      0x0000000000020000UL | FCML_AMT_MMX
#define    FCML_AMT_TBM        0x0000000000040000UL | FCML_AMT_VEXx
#define    FCML_AMT_BMI1       0x0000000000080000UL
#define    FCML_AMT_BMI2       0x0000000000100000UL
#define    FCML_AMT_HLE        0x0000000000200000UL
#define    FCML_AMT_ADX        0x0000000000400000UL
#define    FCML_AMT_CLMUL      0x0000000000800000UL
#define    FCML_AMT_F16C       0x0000000001000000UL | FCML_AMT_VEXx
#define    FCML_AMT_RDRAND     0x0000000002000000UL
#define    FCML_AMT_RDSEED     0x0000000004000000UL
#define    FCML_AMT_PRFCHW     0x0000000008000000UL
#define    FCML_AMT_LWP        0x0000000010000000UL | FCML_AMT_SIMD
#define    FCML_AMT_SVM        0x0000000020000000UL
#define    FCML_AMT_FSGSBASE   0x0000000040000000UL
#define    FCML_AMT_FMA        0x0000000080000000UL | FCML_AMT_SIMD
#define    FCML_AMT_FMA4       0x0000000100000000UL | FCML_AMT_SIMD
#define    FCML_AMT_XOP        0x0000000200000000UL | FCML_AMT_SIMD
#define    FCML_AMT_EDX        0x0000000400000000UL
#define    FCML_AMT_ABM        0x0000000800000000UL
#define    FCML_AMT_VMX        0x0000001000000000UL
#define    FCML_AMT_SMX        0x0000002000000000UL
#define    FCML_AMT_POPCNT     0x0000004000000000UL
#define    FCML_AMT_RTM        0x0000008000000000UL
/* Control transfer instructions. */
#define    FCML_AMT_CTI        0x0000010000000000UL
#define    FCML_AMT_BRANCH     0x0000020000000000UL
/* End of control transfer instructions. */
#define    FCML_AMT_AVX512     0x0000040000000000UL
/* Shortcuts. */
#define    FCML_AMT_MMX_SIMD    FCML_AMT_MMX    | FCML_AMT_SIMD
#define    FCML_AMT_SSE_SIMD    FCML_AMT_SSE    | FCML_AMT_SIMD
#define    FCML_AMT_SSE2_SIMD   FCML_AMT_SSE2   | FCML_AMT_SIMD
#define    FCML_AMT_SSE3_SIMD   FCML_AMT_SSE3   | FCML_AMT_SIMD
#define    FCML_AMT_SSSE3_SIMD  FCML_AMT_SSSE3  | FCML_AMT_SIMD
#define    FCML_AMT_SSE41_SIMD  FCML_AMT_SSE41  | FCML_AMT_SIMD
#define    FCML_AMT_SSE42_SIMD  FCML_AMT_SSE42  | FCML_AMT_SIMD
#define    FCML_AMT_AVX_SIMD    FCML_AMT_AVX    | FCML_AMT_SIMD
#define    FCML_AMT_AVX2_SIMD   FCML_AMT_AVX2   | FCML_AMT_SIMD
#define    FCML_AMT_3DNOW_SIMD  FCML_AMT_3DNOW  | FCML_AMT_SIMD
#define    FCML_AMT_AVX512_SIMD FCML_AMT_AVX512 | FCML_AMT_SIMD

/** @} */

/** Instruction forms. */
enum fcml_en_instruction_addr_mode_codes {
    FCML_AM_UNKNOWN,
    FCML_AM_NO_OPERANS,
    FCML_AM_IMM8,
    FCML_AM_IMMO,
    FCML_AM_ER8_IMM8,
    FCML_AM_R8_IMM8,
    FCML_AM_ERO_IMMO,
    FCML_AM_RM8_IMM8,
    FCML_AM_RMO_IMMO,
    FCML_AM_R0_IMM0,
    FCML_AM_RMO_IMM8,
    FCML_AM_RM8_R8,
    FCML_AM_R8_RM8,
    FCML_AM_R8_MOFF8,
    FCML_AM_MOFF8_R8,
    FCML_AM_R16_RM8,
    FCML_AM_RO_RM16,
    FCML_AM_RMO_RO,
    FCML_AM_RO_RMO,
    FCML_AM_RO_MOFFO,
    FCML_AM_RO_MO,
    FCML_AM_MOFFO_RO,
    FCML_AM_MO_RO,
    FCML_AM_RO_RM8,
    FCML_AM_RM_SR,
    FCML_AM_SR_RM,
    FCML_AM_R32_DR,
    FCML_AM_R64_DR,
    FCML_AM_DR_R32,
    FCML_AM_DR_R64,
    FCML_AM_R32_CR,
    FCML_AM_R64_CR,
    FCML_AM_CR_R32,
    FCML_AM_CR_R64,
    FCML_AM_RO_RMO_IMM8,
    FCML_AM_RO_RMO_IMMO,
    FCML_AM_R32A_RM32_R32B,
    FCML_AM_R64A_RM64_R64B,
    FCML_AM_R32_RM32,
    FCML_AM_R64_RM64,
    FCML_AM_R32_RM32_R32,
    FCML_AM_R64_RM64_R64,
    FCML_AM_REL16,
    FCML_AM_PTR16_O,
    FCML_AM_M16_O,
    FCML_AM_M8_M8,
    FCML_AM_MO_MO,
    FCML_AM_M8,
    FCML_AM_M16,
    FCML_AM_M32,
    FCML_AM_M64,
    FCML_AM_M80,
    FCML_AM_M128,
    FCML_AM_RX_RM32,
    FCML_AM_RX_RM64,
    FCML_AM_RX_RX_RM32,
    FCML_AM_RX_RX_RM64,
    FCML_AM_R32_RXM64,
    FCML_AM_R64_RXM64,
    FCML_AM_RM8,
    FCML_AM_RMO,
    FCML_AM_RO,
    FCML_AM_SRO,
    FCML_AM_SR_FSGSO,
    FCML_AM_ST0_ST,
    FCML_AM_ST_ST0,
    FCML_AM_ST,
    FCML_AM_M2BYTE,
    FCML_AM_AX,
    FCML_AM_R64_M128,
    FCML_AM_R32_M128,
    FCML_AM_RX_RX_I8_I8,
    FCML_AM_RX_RX,
    FCML_AM_REL8,
    FCML_AM_REL0
};

/**
 * @defgroup INSTRUCTION_GROUP Supported instructions codes.
 * Set of all supported instructions. Names are based on Intel syntax.
 * @{
 */

/** Instruction codes. */
typedef enum fcml_en_instruction {
    F_UNKNOWN,
    F_AAA,
    F_JCC,
    F_AAD,
    F_AAM,
    F_AAS,
    F_ADC,
    F_ADD,
    F_ADDPD,
    F_VADDPD,
    F_ADDPS,
    F_VADDPS,
    F_ADDSD,
    F_VADDSD,
    F_ADDSS,
    F_VADDSS,
    F_ADDSUBPD,
    F_VADDSUBPD,
    F_ADDSUBPS,
    F_VADDSUBPS,
    F_AESDEC,
    F_VAESDEC,
    F_AESDECLAST,
    F_VAESDECLAST,
    F_AESENC,
    F_VAESENC,
    F_AESENCLAST,
    F_VAESENCLAST,
    F_AESIMC,
    F_VAESIMC,
    F_AESKEYGENASSIST,
    F_VAESKEYGENASSIST,
    F_AND,
    F_ANDPD,
    F_VANDPD,
    F_ANDPS,
    F_VANDPS,
    F_ANDNPD,
    F_VANDNPD,
    F_ANDNPS,
    F_VANDNPS,
    F_ARPL,
    F_ANDN,
    F_ADCX,
    F_ADOX,
    F_BLENDPD,
    F_VBLENDPD,
    F_BLENDPS,
    F_VBLENDPS,
    F_BLENDVPD,
    F_VBLENDVPD,
    F_BLENDVPS,
    F_VBLENDVPS,
    F_BOUND,
    F_BSF,
    F_BSR,
    F_BSWAP,
    F_BT,
    F_BTC,
    F_BTR,
    F_BTS,
    F_BEXR,
    F_BLCFILL,
    F_BLCI,
    F_BLCIC,
    F_BLCMSK,
    F_BLCS,
    F_BLSFILL,
    F_BLSI,
    F_BLSIC,
    F_BLSMSK,
    F_BLSR,
    F_BZHI,
    F_CALL,
    F_CBW,
    F_CWDE = F_CBW,
    F_CDQE = F_CBW,
    F_CLC,
    F_CLD,
    F_CLFLUSH,
    F_CLI,
    F_CLGI,
    F_CLTS,
    F_CMC,
    F_CMOV,
    F_CMP,
    F_CMPPD,
    F_VCMPPD,
    F_CMPPS,
    F_VCMPPS,
    F_CMPS,
    F_CMPSD,
    F_VCMPSD,
    F_CMPSS,
    F_VCMPSS,
    F_CMPXCHG,
    F_CMPXCHGxB,
    F_CPUID,
    F_CRC32,
    F_CVTDQ2PD,
    F_VCVTDQ2PD,
    F_CVTDQ2PS,
    F_VCVTDQ2PS,
    F_CVTPD2DQ,
    F_VCVTPD2DQ,
    F_CVTPD2PI,
    F_CVTPD2PS,
    F_VCVTPD2PS,
    F_CVTPI2PD,
    F_CVTPI2PS,
    F_CVTPS2DQ,
    F_VCVTPS2DQ,
    F_CVTPS2PD,
    F_VCVTPS2PD,
    F_CVTPS2PI,
    F_CVTSD2SI,
    F_VCVTSD2SI,
    F_CVTSD2SS,
    F_VCVTSD2SS,
    F_CVTSI2SD,
    F_VCVTSI2SD,
    F_CVTSI2SS,
    F_VCVTSI2SS,
    F_CVTSS2SD,
    F_VCVTSS2SD,
    F_CVTSS2SI,
    F_VCVTSS2SI,
    F_CVTTPD2DQ,
    F_VCVTTPD2DQ,
    F_CVTTPD2PI,
    F_CVTTPS2DQ,
    F_VCVTTPS2DQ,
    F_CVTTPS2PI,
    F_CVTTSD2SI,
    F_VCVTTSD2SI,
    F_CVTTSS2SI,
    F_VCVTTSS2SI,
    F_CWD,
    F_CDQ = F_CWD,
    F_CQO = F_CWD,
    F_COMISD,
    F_VCOMISD,
    F_COMISS,
    F_VCOMISS,
    F_DAA,
    F_DAS,
    F_DEC,
    F_DIV,
    F_DIVPD,
    F_VDIVPD,
    F_DIVPS,
    F_VDIVPS,
    F_DIVSD,
    F_VDIVSD,
    F_DIVSS,
    F_VDIVSS,
    F_DPPD,
    F_VDPPD,
    F_DPPS,
    F_VDPPS,
    F_EMMS,
    F_ENTER,
    F_EXTRACTPS,
    F_VEXTRACTPS,
    F_EXTRQ,
    F_F2XM1,
    F_FABS,
    F_FADD,
    F_FIADD,
    F_FADDP,
    F_FBLD,
    F_FBSTP,
    F_FCHS,
    F_FCLEX,
    F_FNCLEX,
    F_FCMOVB,
    F_FCMOVE,
    F_FCMOVBE,
    F_FCMOVU,
    F_FCMOVNB,
    F_FCMOVNE,
    F_FCMOVNBE,
    F_FCMOVNU,
    F_FCOS,
    F_FCOM,
    F_FCOMP,
    F_FCOMPP,
    F_FCOMI,
    F_FCOMIP,
    F_FUCOMI,
    F_FUCOMIP,
    F_FDECSTP,
    F_FDIV,
    F_FDIVP,
    F_FIDIV,
    F_FDIVR,
    F_FDIVRP,
    F_FIDIVR,
    F_FFREE,
    F_FICOM,
    F_FICOMP,
    F_FILD,
    F_FINCSTP,
    F_FINIT,
    F_FNINIT,
    F_FIST,
    F_FISTP,
    F_FLD,
    F_FLD1,
    F_FLDL2T,
    F_FLDL2E,
    F_FLDPI,
    F_FLDLG2,
    F_FLDLN2,
    F_FLDZ,
    F_FLDCW,
    F_FLDENV,
    F_FMUL,
    F_FMULP,
    F_FIMUL,
    F_FNOP,
    F_FPATAN,
    F_FPREM,
    F_FPREM1,
    F_FPTAN,
    F_FRNDINT,
    F_FRSTOR,
    F_FSAVE,
    F_FNSAVE,
    F_FSCALE,
    F_FSIN,
    F_FSINCOS,
    F_FSQRT,
    F_FST,
    F_FSTP,
    F_FSTCW,
    F_FNSTCW,
    F_FSTENV,
    F_FNSTENV,
    F_FSTSW,
    F_FNSTSW,
    F_FSUB,
    F_FSUBP,
    F_FISUB,
    F_FSUBR,
    F_FSUBRP,
    F_FISUBR,
    F_FTST,
    F_FUCOM,
    F_FUCOMP,
    F_FUCOMPP,
    F_FXAM,
    F_FXCH,
    F_FXRSTOR,
    F_FXRSTOR64,
    F_FXSAVE,
    F_FXSAVE64,
    F_FXTRACT,
    F_FYL2X,
    F_FYL2XP1,
    F_FEMMS,
    F_FISTTP,
    F_GETSEC,
    F_HADDPD,
    F_VHADDPD,
    F_HADDPS,
    F_VHADDPS,
    F_HLT,
    F_HSUBPD,
    F_VHSUBPD,
    F_HSUBPS,
    F_VHSUBPS,
    F_INVEPT,
    F_INVVPID,
    F_IDIV,
    F_IMUL,
    F_IN,
    F_INC,
    F_INS,
    F_INSERTPS,
    F_VINSERTPS,
    F_VEXTRACTF128,
    F_VEXTRACTF32X4,
    F_VEXTRACTF64X2,
    F_VEXTRACTF32X8,
    F_VEXTRACTF64X4,
    F_VEXTRACTI32X4,
    F_VEXTRACTI64X2,
    F_VEXTRACTI32X8,
    F_VEXTRACTI64X4,
    F_VINSERTF128,
    F_VFIXUPIMMPD,
    F_VFIXUPIMMPS,
    F_VFIXUPIMMSD,
    F_VFIXUPIMMSS,
    F_INSERTQ,
    F_INT3,
    F_INT,
    F_INTO,
    F_INVD,
    F_INVLPG,
    F_INVLPGA,
    F_INVPCID,
    F_IRET,
    F_JCXZ,
    F_JECXZ = F_JCXZ,
    F_JRCXZ = F_JCXZ,
    F_JMP,
    F_KADDB,
    F_KADDD,
    F_KADDW,
    F_KADDQ,
    F_KANDB,
    F_KANDD,
    F_KANDW,
    F_KANDQ,
    F_KANDNB,
    F_KANDND,
    F_KANDNW,
    F_KANDNQ,
    F_KMOVB,
    F_KMOVW,
    F_KMOVD,
    F_KMOVQ,
    F_KNOTB,
    F_KNOTW,
    F_KNOTD,
    F_KNOTQ,
    F_KORB,
    F_KORW,
    F_KORD,
    F_KORQ,
    F_KORTESTB,
    F_KORTESTW,
    F_KORTESTD,
    F_KORTESTQ,
    F_KSHIFTLW,
    F_KSHIFTLB,
    F_KSHIFTLQ,
    F_KSHIFTLD,
    F_KSHIFTRW,
    F_KSHIFTRB,
    F_KSHIFTRQ,
    F_KSHIFTRD,
    F_KTESTB,
    F_KTESTW,
    F_KTESTD,
    F_KTESTQ,
    F_KXNORB,
    F_KXNORD,
    F_KXNORW,
    F_KXNORQ,
    F_KXORB,
    F_KXORD,
    F_KXORW,
    F_KXORQ,
    F_LAR,
    F_LAHF,
    F_LDDQU,
    F_VLDDQU,
    F_LDMXCSR,
    F_VLDMXCSR,
    F_LDS,
    F_LSS,
    F_LES,
    F_LFS,
    F_LGS,
    F_LEA,
    F_LEAVE,
    F_LFENCE,
    F_LLWPCB,
    F_LGDT,
    F_LIDT,
    F_LLDT,
    F_LMSW,
    F_LODS,
    F_LOOP,
    F_LOOPE,
    F_LOOPNE,
    F_LWPINS,
    F_LWPVAL,
    F_LSL,
    F_LTR,
    F_LZCNT,
    F_MASKMOVDQU,
    F_VMASKMOVDQU,
    F_MASKMOVQ,
    F_VMASKMOVPS,
    F_VMASKMOVPD,
    F_VPMASKMOVD,
    F_VPMASKMOV,
    F_VPMASKMOVQ,
    F_MAXPD,
    F_VMAXPD,
    F_MAXPS,
    F_VMAXPS,
    F_MAXSD,
    F_VMAXSD,
    F_MAXSS,
    F_VMAXSS,
    F_MFENCE,
    F_MINPD,
    F_VMINPD,
    F_MINPS,
    F_VMINPS,
    F_MINSD,
    F_VMINSD,
    F_MINSS,
    F_VMINSS,
    F_MONITOR,
    F_MOVAPD,
    F_VMOVAPD,
    F_MOVAPS,
    F_VMOVAPS,
    F_MOVBE,
    F_MOV,
    F_MOVD,
    F_VMOVD,
    F_MOVQ,
    F_VMOVQ,
    F_MOVDDUP,
    F_VMOVDDUP,
    F_MOVDQA,
    F_VMOVDQA,
    F_VMOVDQA32,
    F_VMOVDQA64,
    F_MOVDQU,
    F_VMOVDQU,
    F_VMOVDQU8,
    F_VMOVDQU16,
    F_VMOVDQU32,
    F_VMOVDQU64,
    F_MOVDQ2Q,
    F_MOVHLPS,
    F_VMOVHLPS,
    F_MOVHPD,
    F_VMOVHPD,
    F_MOVHPS,
    F_VMOVHPS,
    F_MOVLHPS,
    F_VMOVLHPS,
    F_MOVLPD,
    F_VMOVLPD,
    F_MOVLPS,
    F_VMOVLPS,
    F_MOVMSKPD,
    F_VMOVMSKPD,
    F_MOVMSKPS,
    F_VMOVMSKPS,
    F_MOVNTDQA,
    F_VMOVNTDQA,
    F_MOVNTDQ,
    F_VMOVNTDQ,
    F_MOVS,
    F_MOVNTI,
    F_MOVNTPD,
    F_VMOVNTPD,
    F_MOVNTPS,
    F_VMOVNTPS,
    F_MOVNTSD,
    F_MOVNTSS,
    F_MOVNTQ,
    F_MOVQ2DQ,
    F_MOVSD,
    F_VMOVSD,
    F_MOVSHDUP,
    F_VMOVSHDUP,
    F_MOVSLDUP,
    F_VMOVSLDUP,
    F_MOVSS,
    F_VMOVSS,
    F_MOVSX,
    F_MOVSXD,
    F_MOVUPD,
    F_VMOVUPD,
    F_MOVUPS,
    F_VMOVUPS,
    F_MOVZX,
    F_MPSADBW,
    F_VMPSADBW,
    F_MUL,
    F_MULPD,
    F_VMULPD,
    F_MULPS,
    F_VMULPS,
    F_MULSD,
    F_VMULSD,
    F_MULSS,
    F_VMULSS,
    F_MWAIT,
    F_NEG,
    F_NOP,
    F_NOT,
    F_OR,
    F_ORPD,
    F_VORPD,
    F_ORPS,
    F_VORPS,
    F_OUT,
    F_OUTS,
    F_PABSW,
    F_PABSB,
    F_PABSD,
    F_VPABSB,
    F_VPABSW,
    F_VPABSD,
    F_VPABSQ,
    F_VPACKSSWB,
    F_PACKSSWB,
    F_VPACKSSDW,
    F_PACKSSDW,
    F_PACKUSDW,
    F_VPACKUSDW,
    F_PACKUSWB,
    F_VPACKUSWB,
    F_VPADDW,
    F_PADDW,
    F_VPADDB,
    F_VPADDD,
    F_PADDB,
    F_PADDD,
    F_VPADDSW,
    F_PADDSB,
    F_PADDSW,
    F_VPADDSB,
    F_PADDUSW,
    F_PADDUSB,
    F_VPADDUSW,
    F_PADDQ,
    F_VPADDUSB,
    F_VPADDQ,
    F_POP,
    F_PUSH,
    F_POPA,
    F_POPAD,
    F_POPF,
    F_POPFQ,
    F_POPFD,
    F_PUSHA,
    F_PUSHF,
    F_PUSHAD,
    F_PUSHFQ,
    F_PUSHFD,
    F_PAVGUSB,
    F_PF2ID,
    F_PFACC,
    F_PFADD,
    F_PFCMPEQ,
    F_PFCMPGE,
    F_PFCMPGT,
    F_PFMAX,
    F_PFMIN,
    F_PFMUL,
    F_PFRCP,
    F_PFRCPIT1,
    F_PFRCPIT2,
    F_PFRSQIT1,
    F_PFRSQRT,
    F_PFSUB,
    F_PFSUBR,
    F_PI2FD,
    F_PMULHRW,
    F_PF2IW,
    F_PFNACC,
    F_PFPNACC,
    F_PI2FW,
    F_PSWAPD,
    F_PALIGNR,
    F_VPALIGNR,
    F_PAND,
    F_VPAND,
    F_VPANDD,
    F_VPANDQ,
    F_PANDN,
    F_VPANDN,
    F_VPANDND,
    F_VPANDNQ,
    F_PAUSE,
    F_PAVGW,
    F_PAVGB,
    F_VPAVGW,
    F_VPAVGB,
    F_PBLENDVB,
    F_VPBLENDVB,
    F_PBLENDW,
    F_VPBLENDW,
    F_VPBLENDD,
    F_PCLMULQDQ,
    F_VPCLMULQDQ,
    F_PCMPEQW,
    F_PCMPEQB,
    F_PCMPEQD,
    F_VPCMPEQD,
    F_VPCMPEQW,
    F_VPCMPEQB,
    F_PCMPEQQ,
    F_VPCMPEQQ,
    F_PCMPESTRI,
    F_VPCMPESTRI,
    F_PCMPESTRM,
    F_VPCMPESTRM,
    F_PCMPGTW,
    F_PCMPGTD,
    F_PCMPGTB,
    F_VPCMPGTW,
    F_VPCMPGTD,
    F_VPCMPGTB,
    F_PCMPGTQ,
    F_VPCMPGTQ,
    F_PCMPISTRI,
    F_VPCMPISTRI,
    F_PCMPISTRM,
    F_VPCMPISTRM,
    F_VPEXTRB,
    F_VPEXTRQ,
    F_PEXTRQ,
    F_PEXTRB,
    F_PEXTRD,
    F_VPEXTRD,
    F_PEXTRW,
    F_VPEXTRW,
    F_VPHADDW,
    F_VPHADDD,
    F_PHADDD,
    F_PHADDW,
    F_PHADDSW,
    F_VPHADDSW,
    F_PHMINPOSUW,
    F_VPHMINPOSUW,
    F_PHSUBD,
    F_PHSUBW,
    F_VPHSUBD,
    F_VPHSUBW,
    F_PHSUBSW,
    F_VPHSUBSW,
    F_PINSRD,
    F_VPINSRQ,
    F_PINSRQ,
    F_PINSRB,
    F_VPINSRD,
    F_VPINSRB,
    F_PINSRW,
    F_VPINSRW,
    F_PMADDUBSW,
    F_VPMADDUBSW,
    F_PMADDWD,
    F_VPMADDWD,
    F_PMAXSB,
    F_VPMAXSB,
    F_PMAXSD,
    F_VPMAXSD,
    F_VPMAXSQ,
    F_PMAXSW,
    F_VPMAXSW,
    F_PMAXUB,
    F_VPMAXUB,
    F_PMAXUD,
    F_VPMAXUD,
    F_VPMAXUQ,
    F_PMAXUW,
    F_VPMAXUW,
    F_PMINSB,
    F_VPMINSB,
    F_PMINSD,
    F_VPMINSD,
    F_VPMINSQ,
    F_PMINSW,
    F_VPMINSW,
    F_PMINUW,
    F_VPMINUW,
    F_PMINUB,
    F_VPMINUB,
    F_PMINUD,
    F_VPMINUD,
    F_VPMINUQ,
    F_PMOVMSKB,
    F_VPMOVMSKB,
    F_VPMOVSXBQ,
    F_PMOVSXBW,
    F_PMOVSXWQ,
    F_VPMOVSXWQ,
    F_PMOVSXWD,
    F_PMOVSXBD,
    F_VPMOVSXDQ,
    F_VPMOVSXWD,
    F_PMOVSXBQ,
    F_VPMOVSXBW,
    F_PMOVSXDQ,
    F_VPMOVSXBD,
    F_PMOVZXWD,
    F_PMOVZXDQ,
    F_VPMOVZXDQ,
    F_PMOVZXWQ,
    F_VPMOVZXBQ,
    F_PMOVZXBQ,
    F_VPMOVZXWD,
    F_VPMOVZXBD,
    F_VPMOVZXWQ,
    F_PMOVZXBD,
    F_VPMOVZXBW,
    F_PMOVZXBW,
    F_PMULDQ,
    F_PMULHRSW,
    F_PMULHUW,
    F_VPMULDQ,
    F_VPMULHRSW,
    F_VPMULHUW,
    F_PMULHW,
    F_VPMULHW,
    F_PMULUDQ,
    F_VPMULUDQ,
    F_PMULLW,
    F_PMULLD,
    F_VPMULLD,
    F_VPMULLQ,
    F_VPMULLW,
    F_POPCNT,
    F_POR,
    F_VPOR,
    F_VPORD,
    F_VPORQ,
    F_PREFETCHT2,
    F_PREFETCHW,
    F_PREFETCHT1,
    F_PREFETCHNTA,
    F_PREFETCHT0,
    F_PREFETCHWT1,
    F_PSADBW,
    F_VPSADBW,
    F_PSHUFB,
    F_PSHUFD,
    F_PSHUFHW,
    F_VPSHUFD,
    F_VPSHUFB,
    F_PSHUFLW,
    F_PSHUFW,
    F_VPSHUFLW,
    F_VPSHUFHW,
    F_VPSIGNB,
    F_VPSIGND,
    F_PSIGNW,
    F_PSIGNB,
    F_VPSIGNW,
    F_PSIGND,
    F_PSLLDQ,
    F_VPSLLDQ,
    F_PSLLQ,
    F_PSLLD,
    F_VPSLLW,
    F_VPSLLQ,
    F_PSLLW,
    F_VPSLLD,
    F_VPSRAW,
    F_PSRAD,
    F_PSRAW,
    F_VPSRAD,
    F_VPSRAQ,
    F_PSRLDQ,
    F_VPSRLDQ,
    F_VPSRLQ,
    F_PSRLQ,
    F_PSRLD,
    F_PSRLW,
    F_VPSRLD,
    F_VPSRLW,
    F_VPSUBD,
    F_PSUBD,
    F_PSUBW,
    F_VPSUBB,
    F_VPSUBQ,
    F_PSUBB,
    F_VPSUBW,
    F_PSUBQ,
    F_PSUBSB,
    F_VPSUBSW,
    F_VPSUBSB,
    F_PSUBSW,
    F_VPSUBUSW,
    F_VPSUBUSB,
    F_PSUBUSB,
    F_PSUBUSW,
    F_VPTEST,
    F_PTEST,
    F_PUNPCKLBW,
    F_PUNPCKLQDQ,
    F_VPUNPCKLWD,
    F_VPUNPCKLQDQ,
    F_VPUNPCKLBW,
    F_PUNPCKLWD,
    F_PUNPCKLDQ,
    F_VPUNPCKLDQ,
    F_VPUNPCKHWD,
    F_PUNPCKHDQ,
    F_PUNPCKHWD,
    F_PUNPCKHQDQ,
    F_VPUNPCKHQDQ,
    F_VPUNPCKHBW,
    F_PUNPCKHBW,
    F_VPUNPCKHDQ,
    F_PXOR,
    F_VPXOR,
    F_VPXORD,
    F_VPXORQ,
    F_PREFETCH,
    F_RCL,
    F_RCR,
    F_ROL,
    F_ROR,
    F_RET,
    F_RETF,
    F_RCPPS,
    F_VRCPPS,
    F_RCPSS,
    F_VRCPSS,
    F_RDFSBASE,
    F_RDGSBASE,
    F_RDRAND,
    F_RDTSCP,
    F_RDTSC,
    F_RDPMC,
    F_RDMSR,
    F_ROUNDPD,
    F_VROUNDPD,
    F_ROUNDPS,
    F_VROUNDPS,
    F_ROUNDSD,
    F_VROUNDSD,
    F_ROUNDSS,
    F_VROUNDSS,
    F_RSM,
    F_RSQRTPS,
    F_VRSQRTPS,
    F_RSQRTSS,
    F_VRSQRTSS,
    F_SAHF,
    F_SAR,
    F_SAL,
    F_SHL = F_SAL,
    F_SHR,
    F_SBB,
    F_SCAS,
    F_SET,
    F_STOS,
    F_SUB,
    F_SFENCE,
    F_SGDT,
    F_SHLD,
    F_SHRD,
    F_SKINIT,
    F_SLWPCB,
    F_SHUFPD,
    F_VSHUFPD,
    F_SHUFPS,
    F_VSHUFPS,
    F_SIDT,
    F_SLDT,
    F_SMSW,
    F_SQRTPD,
    F_VSQRTPD,
    F_SQRTPS,
    F_VSQRTPS,
    F_SQRTSD,
    F_VSQRTSD,
    F_SQRTSS,
    F_VSQRTSS,
    F_STC,
    F_STD,
    F_STGI,
    F_STI,
    F_STMXCSR,
    F_VSTMXCSR,
    F_STR,
    F_SUBPD,
    F_VSUBPD,
    F_SUBPS,
    F_VSUBPS,
    F_SUBSD,
    F_VSUBSD,
    F_SUBSS,
    F_VSUBSS,
    F_SWAPGS,
    F_SYSCALL,
    F_SYSENTER,
    F_SYSEXIT,
    F_SYSRET,
    F_TEST,
    F_T1MSKC,
    F_UCOMISD,
    F_VUCOMISD,
    F_UCOMISS,
    F_VUCOMISS,
    F_UD2,
    F_UNPCKHPD,
    F_VUNPCKHPD,
    F_UNPCKHPS,
    F_VUNPCKHPS,
    F_UNPCKLPD,
    F_VUNPCKLPD,
    F_UNPCKLPS,
    F_VUNPCKLPS,
    F_VMLOAD,
    F_VMRUN,
    F_VMSAVE,
    F_VFRCZPD,
    F_VFRCZPS,
    F_VFRCZSD,
    F_VFRCZSS,
    F_VPCMOV,
    F_VPERMIL2PD,
    F_VPERMIL2PS,
    F_VPHADDBD,
    F_VPHADDBW,
    F_VPHADDBQ,
    F_VPHADDDQ,
    F_VPHADDUBD,
    F_VPHADDUBQ,
    F_VPHADDUBW,
    F_VPHADDUDQ,
    F_VPHADDUWD,
    F_VPHADDUWQ,
    F_VPHADDWD,
    F_VPHADDWQ,
    F_VPHSUBBW,
    F_VPHSUBDQ,
    F_VPHSUBWD,
    F_VPMACSDD,
    F_VPMACSDQH,
    F_VPMACSDQL,
    F_VPMACSSDD,
    F_VPMACSSDQH,
    F_VPMACSSDQL,
    F_VPMACSSWD,
    F_VPMACSSWW,
    F_VPMACSWD,
    F_VPMACSWW,
    F_VPMADCSSWD,
    F_VPMADCSWD,
    F_VPPERM,
    F_VPROTD,
    F_VPROTB,
    F_VPROTQ,
    F_VPROTW,
    F_VPSHAB,
    F_VPSHAD,
    F_VPSHAQ,
    F_VPSHAW,
    F_VPSHLB,
    F_VPSHLD,
    F_VPSHLQ,
    F_VPSHLW,
    F_VFMADD213PD,
    F_VFMADDPD,
    F_VFMADD132PD,
    F_VFMADD231PD,
    F_VFMADDPS,
    F_VFMADD231PS,
    F_VFMADD132PS,
    F_VFMADD213PS,
    F_VFMADD132SD,
    F_VFMADD213SD,
    F_VFMADDSD,
    F_VFMADD231SD,
    F_VFMADD132SS,
    F_VFMADD213SS,
    F_VFMADDSS,
    F_VFMADD231SS,
    F_VFMADDSUB132PD,
    F_VFMADDSUB213PD,
    F_VFMADDSUBPD,
    F_VFMADDSUB231PD,
    F_VFMADDSUB231PS,
    F_VFMADDSUBPS,
    F_VFMADDSUB132PS,
    F_VFMADDSUB213PS,
    F_VFMSUBADDPD,
    F_VFMSUBADD213PD,
    F_VFMSUBADD132PD,
    F_VFMSUBADD231PD,
    F_VFMSUBADDPS,
    F_VFMSUBADD213PS,
    F_VFMSUBADD132PS,
    F_VFMSUBADD231PS,
    F_VFMSUB213PD,
    F_VFMSUBPD,
    F_VFMSUB132PD,
    F_VFMSUB231PD,
    F_VFMSUB213PS,
    F_VFMSUBPS,
    F_VFMSUB132PS,
    F_VFMSUB231PS,
    F_VFMSUBSD,
    F_VFMSUB231SD,
    F_VFMSUB132SD,
    F_VFMSUB213SD,
    F_VFMSUB231SS,
    F_VFMSUB213SS,
    F_VFMSUB132SS,
    F_VFMSUBSS,
    F_VFNMADD231PD,
    F_VFNMADDPD,
    F_VFNMADD132PD,
    F_VFNMADD213PD,
    F_VFNMADD231PS,
    F_VFNMADD132PS,
    F_VFNMADD213PS,
    F_VFNMADDPS,
    F_VFNMADD213SD,
    F_VFNMADDSD,
    F_VFNMADD231SD,
    F_VFNMADD132SD,
    F_VFNMADD213SS,
    F_VFNMADDSS,
    F_VFNMADD231SS,
    F_VFNMADD132SS,
    F_VFNMSUB132PD,
    F_VFNMSUB213PD,
    F_VFNMSUB231PD,
    F_VFNMSUBPD,
    F_VFNMSUBPS,
    F_VFNMSUB213PS,
    F_VFNMSUB132PS,
    F_VFNMSUB231PS,
    F_VFNMSUBSD,
    F_VFNMSUB231SD,
    F_VFNMSUB213SD,
    F_VFNMSUB132SD,
    F_VFNMSUBSS,
    F_VFNMSUB132SS,
    F_VFNMSUB213SS,
    F_VFNMSUB231SS,
    F_VFPCLASSPD,
    F_VFPCLASSPS,
    F_VFPCLASSSD,
    F_VFPCLASSSS,
    F_BEXTR,
    F_VPBROADCASTW,
    F_VPBROADCASTB,
    F_VPBROADCASTD,
    F_VPBROADCASTQ,
    F_VBROADCASTI32X2,
    F_VBROADCASTI32X4,
    F_VBROADCASTI64X2,
    F_VBROADCASTI32X8,
    F_VBROADCASTI64X4,
    F_VPBROADCASTMB2Q,
    F_VPBROADCASTMW2D,
    F_VPCMPB,
    F_VPCMPUB,
    F_VPCMPW,
    F_VPCMPUW,
    F_VPCMPD,
    F_VPCMPUD,
    F_VPCMPQ,
    F_VPCMPUQ,
    F_VCOMPRESSPD,
    F_VCOMPRESSPS,
    F_VPCOMPRESSD,
    F_VPCOMPRESSQ,
    F_VCVTPD2QQ,
    F_VCVTTPS2UQQ,
    F_VCVTTPS2QQ,
    F_VCVTPD2UDQ,
    F_VCVTTPD2UQQ,
    F_VCVTTPS2UDQ,
    F_VMPTRLD,
    F_VCVTPD2UQQ,
    F_VMPTRST,
    F_VMCLEAR,
    F_VMREAD,
    F_VMWRITE,
    F_VMLAUNCH,
    F_VMRESUME,
    F_VMXOFF,
    F_VMXON,
    F_VMCALL,
    F_VMFUNC,
    F_VALIGND,
    F_VALIGNQ,
    F_VBLENDMPD,
    F_VBLENDMPS,
    F_VBROADCASTSD,
    F_VBROADCASTSS,
    F_VBROADCASTI128,
    F_VBROADCASTF128,
    F_VBROADCASTF32X2,
    F_VBROADCASTF32X4,
    F_VBROADCASTF32X8,
    F_VBROADCASTF64X2,
    F_VBROADCASTF64X4,
    F_VCVTPH2PS,
    F_VCVTPS2PH,
    F_VCVTPS2QQ,
    F_VCVTPS2UDQ,
    F_VCVTPS2UQQ,
    F_VCVTQQ2PD,
    F_VCVTQQ2PS,
    F_VCVTSD2USI,
    F_VCVTSS2USI,
    F_VCVTTSD2USI,
    F_VCVTTSS2USI,
    F_VCVTTPD2QQ,
    F_VCVTUDQ2PS,
    F_VCVTUQQ2PD,
    F_VCVTUSI2SD,
    F_VCVTUSI2SS,
    F_VCVTUQQ2PS,
    F_VCVTUDQ2PD,
    F_VCVTTPD2UDQ,
    F_VDBPSADBW,
    F_VEXPANDPD,
    F_VEXPANDPS,
    F_VERR,
    F_VERW,
    F_VMMCALL,
    F_VPERMILPD,
    F_VPERMILPS,
    F_VPERM2F128,
    F_VPERM2I128,
    F_VPERMI2W,
    F_VPERMI2D,
    F_VPERMI2Q,
    F_VPERMI2PS,
    F_VPERMI2PD,
    F_VPERMT2B,
    F_VPERMT2W,
    F_VPERMT2D,
    F_VPERMT2Q,
    F_VPERMT2PS,
    F_VPERMT2PD,
    F_VPEXPANDD,
    F_VPEXPANDQ,
    F_VPLZCNTD,
    F_VPLZCNTQ,
    F_VPMOVB2M,
    F_VPMOVW2M,
    F_VPMOVD2M,
    F_VPMOVQ2M,
    F_VPMOVM2B,
    F_VPMOVM2W,
    F_VPMOVM2D,
    F_VPMOVM2Q,
    F_VPMOVDB,
    F_VPMOVSDB,
    F_VPMOVUSDB,
    F_VPMOVDW,
    F_VPMOVSDW,
    F_VPMOVUSDW,
    F_VPMOVQB,
    F_VPMOVSQB,
    F_VPMOVUSQB,
    F_VPMOVQD,
    F_VPMOVSQD,
    F_VPMOVUSQD,
    F_VPMOVQW,
    F_VPMOVSQW,
    F_VPMOVUSQW,
    F_VPMOVWB,
    F_VPMOVSWB,
    F_VPMOVUSWB,
    F_VPMULTISHIFTQB,
    F_VPROLVD,
    F_VPROLVQ,
    F_VPROLD,
    F_VPROLQ,
    F_VPRORVD,
    F_VPRORVQ,
    F_VPRORD,
    F_VPRORQ,
    F_VPSCATTERDD,
    F_VPSCATTERDQ,
    F_VPSCATTERQD,
    F_VPSCATTERQQ,
    F_VPSLLVW,
    F_VPSLLVD,
    F_VPSLLVQ,
    F_VPMADD52HUQ,
    F_VPMADD52LUQ,
    F_VEXTRACTI128,
    F_VINSERTI128,
    F_VPSRAVW,
    F_VPSRAVD,
    F_VPSRAVQ,
    F_VPERMD,
    F_VPERMW,
    F_VPERMI2B,
    F_VPERMB,
    F_VPSRLVW,
    F_VPSRLVD,
    F_VPSRLVQ,
    F_VPTERNLOGD,
    F_VPTERNLOGQ,
    F_VPTESTMB,
    F_VPTESTMW,
    F_VPTESTMD,
    F_VPTESTMQ,
    F_VPTESTNMB,
    F_VPTESTNMW,
    F_VPTESTNMD,
    F_VPTESTNMQ,
    F_VRANGEPD,
    F_VRANGEPS,
    F_VRANGESD,
    F_VRANGESS,
    F_VRCP14PD,
    F_VRCP14PS,
    F_VRCP14SD,
    F_VRCP14SS,
    F_VREDUCEPD,
    F_VREDUCEPS,
    F_VREDUCESD,
    F_VREDUCESS,
    F_VRNDSCALEPD,
    F_VRNDSCALEPS,
    F_VRNDSCALESD,
    F_VRNDSCALESS,
    F_VRSQRT14PD,
    F_VRSQRT14PS,
    F_VRSQRT14SD,
    F_VRSQRT14SS,
    F_VSCALEFPD,
    F_VSCALEFPS,
    F_VSCALEFSD,
    F_VSCALEFSS,
    F_VSCATTERDPS,
    F_VSCATTERDPD,
    F_VSCATTERQPS,
    F_VSCATTERQPD,
    F_VSHUFF32X4,
    F_VSHUFF64X2,
    F_VSHUFI32X4,
    F_VSHUFI64X2,
    F_VPERMPD,
    F_VPERMQ,
    F_VPERMPS,
    F_VTESTPS,
    F_VTESTPD,
    F_VGATHERDPD,
    F_VGATHERQPD,
    F_VGATHERDPS,
    F_VGATHERQPS,
    F_VPGATHERDD,
    F_VPGATHERQD,
    F_VPGATHERDQ,
    F_VPGATHERQQ,
    F_VGETEXPPD,
    F_VGETEXPPS,
    F_VGETEXPSD,
    F_VGETEXPSS,
    F_VGETMANTPD,
    F_VGETMANTPS,
    F_VGETMANTSD,
    F_VGETMANTSS,
    F_VINSERTF32X4,
    F_VINSERTF64X2,
    F_VINSERTF32X8,
    F_VINSERTF64X4,
    F_VINSERTI32X4,
    F_VINSERTI64X2,
    F_VINSERTI32X8,
    F_VINSERTI64X4,
    F_VPBLENDMB,
    F_VPBLENDMW,
    F_VPBLENDMD,
    F_VPBLENDMQ,
    F_VZEROALL,
    F_VZEROUPPER,
    F_VPCOMB,
    F_VPCOMW,
    F_VPCOMD,
    F_VPCOMQ,
    F_VPCOMUB,
    F_VPCOMUW,
    F_VPCOMUD,
    F_VPCOMUQ,
    F_WAIT,
    F_FWAIT = F_WAIT,
    F_WBINVD,
    F_WRFSBASE,
    F_WRGSBASE,
    F_WRMSR,
    F_XLAT,
    F_XOR,
    F_XADD,
    F_XCHG,
    F_XGETBV,
    F_XORPD,
    F_VXORPD,
    F_XORPS,
    F_VXORPS,
    F_XRSTOR,
    F_XRSTOR64,
    F_XSAVE,
    F_XSAVE64,
    F_XSAVEOPT,
    F_XSAVEOPT64,
    F_XSETBV,
    F_MULX,
    F_PDEP,
    F_PEXT,
    F_RORX,
    F_SHLX,
    F_SHRX,
    F_SARX,
    F_TZCNT,
    F_TZMSK,
    F_XABORT,
    F_XBEGIN,
    F_XEND,
    F_XTEST,
    F_RDSEED,
    F_CLAC,
    F_STAC,
    F_V4FMADDPS,
    F_V4FNMADDPS,
    F_V4FMADDSS,
    F_V4FNMADDSS,
    F_VEXP2PD,
    F_VEXP2PS,
    F_VGATHERPF0DPS,
    F_VGATHERPF0QPS,
    F_VGATHERPF0DPD,
    F_VGATHERPF0QPD,
    F_VGATHERPF1DPS,
    F_VGATHERPF1QPS,
    F_VGATHERPF1DPD,
    F_VGATHERPF1QPD,
    F_VP4DPWSSDS,
    F_VP4DPWSSD,
    F_VRCP28PD,
    F_VRCP28SD,
    F_VRCP28PS,
    F_VRCP28SS,
    F_VRSQRT28PD,
    F_VRSQRT28SD,
    F_VRSQRT28PS,
    F_VRSQRT28SS,
    F_VSCATTERPF0DPS,
    F_VSCATTERPF0QPS,
    F_VSCATTERPF0DPD,
    F_VSCATTERPF0QPD,
    F_VSCATTERPF1DPS,
    F_VSCATTERPF1QPS,
    F_VSCATTERPF1DPD,
    F_VSCATTERPF1QPD
} fcml_en_instruction;

/** @} */

/**
 * @defgroup PSEUDO_OPERATIONS_GROUP Supported pseudo operations.
 * @{
 */

/** Pseudo operations. */
typedef enum fcml_en_pseudo_operations {
    /** Set if there is no pseudo operation. */
    FP_NO_PSEUDO_OP,
    /** db / .byte */
    FP_DB
} fcml_en_pseudo_operations;

/** @} */

#endif /* FCML_INSTRUCTIONS_H_ */
